/**
 * @author: DaiJiang
 * @date 2016/12/12
 */
(function ($, window) {

    /**
     * Hopechar Tree Component
     * @param config
     * @constructor
     */
    function HQTree(config) {
        /**
         * 这里保存 zTree 内部需要的常量
         * @type {{}}
         * @private
         */
        this._consts = {};

        /**
         * ID
         * @type {string}
         */
        this.id = '';

        this.nodes = [];

        /**
         * 这里保存 zTree 需要的配置信息
         * @type {{async: {enable: boolean, url: *}, check: {enable: boolean}, data: {simpleData: {enable: boolean}}, view: {expandSpeed: string}, callback: {beforeExpand: _setting.callback.beforeExpand, onAsyncSuccess: _setting.callback.onAsyncSuccess, onAsyncError: _setting.callback.onAsyncError}}}
         * @private
         */
        this._setting = {
            async: {
                enable: true,
                url: ''
            }
            ,
            check: {
                enable: true
            }
            ,
            data: {
                simpleData: {
                    enable: true
                }
            }
            ,
            view: {
                expandSpeed: ""
            }
            ,
            callback: {
                beforeExpand: function(){},
                onAsyncSuccess: function (){},
                onAsyncError: function (){}
            }
        };

        jQuery.extend(true, this, config);

        /**
         * 设置 zTree 内部基本属性(初始化时执行）
         * @param setting
         * @private
         */
        this._initRoot = function (setting) {
            console.log("setting")
            console.log(setting);
        };

        /**
         * 设置 zTree 内部的缓存初始化(初始化时执行）
         * @param treeId
         * @private
         */
        this._initCache = function (treeId) {
        };

        /**
         * 设置 zTree 内部事件回调函数(初始化时执行）
         * @param setting
         * @private
         */
        this._bindEvent = function (setting) {
        };

        /**
         * 设置 zTree 事件代理中的处理逻辑，根据不同事件跳转到不同的 handler 处理
         */
        //_eventProxy = function (e) {
        //    return proxyResult;
        //};

        /**
         * 设置 节点数据初始化的处理(加载节点时执行)
         * @param setting
         * @param level
         * @param n
         * @param parentNode
         * @param isFirstNode
         * @param isLastNode
         * @param openFlag
         * @private
         */
        this._initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
        };

        /**
         * 专门用于在节点<a>之前生成 DOM 使用，主要用于 checkbox & radio
         * @param setting
         * @param node
         * @param html
         * @private
         */
        this._beforeA = function (setting, node, html) {
        };

        /**
         * 设置 zTreeObj 的各种对外方法，可以制作新的接口也可以覆盖已有接口
         * @param setting
         * @param zTreeTools
         * @private
         */
        this._zTreeTools = function (setting, zTreeTools) {
            zTreeTools.setNodeIcon = function() {
                alert(2222222);
            }
        };

        /**
         * 定义 zTree 节点数据操作的方法
         * @type {{}}
         * @private
         */
        this._data = {};

        /**
         * 定义 zTree 各种事件绑定 & Proxy 的方法
         * @type {{}}
         * @private
         */
        this._event = {};

        /**
         * 定义 zTree 事件处理的方法
         * @type {{}}
         * @private
         */
        this._handler = {};

        /**
         * 定义 zTree 内部的工具方法
         * @type {{}}
         * @private
         */
        this._tools = {};

        /**
         * 定义 zTree 视图相关的方法
         * @type {{}}
         * @private
         */
        this._view = {};

        /**
         * 将本扩展库内的方法、属性注入到 core 中
         * @type {{tools: {}, view: {}, event: {}, data: {}}}
         * @private
         */
        this._z = {
            tools: this._tools,
            view: this._view,
            event: this._event,
            data: this._data
        };

        this.getZTreeObj = function() {
            return this.tree.getZTreeObj(this.id);
        }

        $.extend(true, $.fn.zTree.consts, this._consts);
        $.extend(true, $.fn.zTree._z, this._z);

        this.tree = $.fn.zTree;
        this.tools = this.tree._z.tools;
        this.consts = this.tree.consts;
        this.view = this.tree._z.view;
        this.data = this.tree._z.data;
        this.event = this.tree._z.event;

        this.init = function() {
            this.tree.init($("#" + this.id), this._setting, this.nodes);
        }

        /**
         * 合并 配置 setting
         */
        this.data.exSetting(this._setting);

        /**
         * 添加 绑定事件处理
         */
        this.data.addInitBind(this._bindEvent);

        /**
         * 添加 初始化 Cache 方法
         */
        this.data.addInitCache(this._initCache);

        /**
         * 添加 初始化 节点数据 方法
         */
        this.data.addInitNode(this._initNode);

        /**
         * 添加 初始化 事件代理 方法
         */
        // HQTree.data.addInitProxy(_eventProxy);

        /**
         * 添加 初始化 zTree 内部基本属性 方法
         */
        this.data.addInitRoot(this._initRoot);

        /**
         * 添加 初始化节点 <A> 之前的DOM 方法
         */
        this.data.addBeforeA(this._beforeA);

        /**
         * 添加 zTreeObj 对象的对外接口
         */
        this.data.addZTreeTools(this._zTreeTools);
    }

    window.HQTree = HQTree;
})(jQuery, window);